/**
 * 
 */
package dgdb2d;

import java.net.InetSocketAddress;
import java.rmi.Remote;
import java.rmi.RemoteException;

import com.tinkerpop.blueprints.pgm.Edge;
import com.tinkerpop.blueprints.pgm.Vertex;

import java.util.HashSet;

/**
 * @author Patryk Chaber, Radian Karpuk, Dominik Zielinski
 * 
 */
public interface RemoteGraph extends Remote {
	/** Nalozenie blokady na indeks przechowujacy informacje o wierzcholkach. */
	void lockRemoteVertexIndex() throws RemoteException;

	/** Zdjecie blokady z indeksu przechowujacego informacje o wierzcholkach. */
	void unlockRemoteVertexIndex() throws RemoteException;

	/** Nalozenie blokady na indeks przechowujacy informacje o krawedziach. */
	void lockRemoteEdgeIndex() throws RemoteException;

	/** Zdjecie blokady z indeksu przechowujacego informacje o krawedziach. */
	void unlockRemoteEdgeIndex() throws RemoteException;

	/** Zapisanie elementu do pliku. */
	void saveRemoteElement(GDBElement element) throws RemoteException;

	/** Dodanie informacji o elemencie do indeksu. */
	void addRemoteElement(GDBElement element, PairIp ipNums) throws RemoteException;

	/** Usuniecie informacji o elemencie z indeksu. */
	void removeRemoteElementFromLocalIndex(GDBElement element) throws RemoteException;

	/** Usuniecie pliku z elementem. */
	void deleteRemoteElement(GDBElement element) throws RemoteException;

	/** Dodanie wierzcholka. */
	Vertex addRemoteVertex(Object id) throws RemoteException;

	/** Pobranie wierzcholka. */
	Vertex getRemoteVertex(Object id) throws RemoteException;

	/** Pobranie wszystkich wierzcholkow. */
	Iterable<Vertex> getRemoteVertices() throws RemoteException;

	/** Usuniecie wierzcholka. */
	void removeRemoteVertex(Vertex vertex) throws RemoteException;

	/** Dodanie krawedzi. */
	Edge addRemoteEdge(Object id, Vertex outVertex, Vertex inVertex, String label) throws RemoteException;

	/** Pobranie krawedzi. */
	Edge getRemoteEdge(Object id) throws RemoteException;

	/** Pobranie wszystkich krawedzi. */
	Iterable<Edge> getRemoteEdges() throws RemoteException;

	/** Usuniecie krawedzi. */
	void removeRemoteEdge(Edge edge) throws RemoteException;

	/** Usuniecie wszystkich elementow. */
	void clearRemote() throws RemoteException;

	/** Zdalne zamkniecie. */
	void shutdownRemote() throws RemoteException;

	/** Pobranie listy adresow serwerow znanych przez serwer. */
	HashSet<InetSocketAddress> getRemoteServerSet() throws RemoteException;

	/** Przywitanie z serwerem. */
	void hereIAm(InetSocketAddress address) throws RemoteException;

	/** Czyszczenie mapy serwerow. */
	void eraseAddressFromServermap(InetSocketAddress address) throws RemoteException;

	/** Pobranie adresu. */
	InetSocketAddress getIp() throws RemoteException;

	/** Pobranie krawedzi wchodzacych do wierzcholka. */
	public Iterable<Edge> getRemoteVertexInEdges(Object id, String[] labels) throws RemoteException;

	/** Pobranie krawedzi wychodzacych z wierzcholka. */
	public Iterable<Edge> getRemoteVertexOutEdges(Object id, String[] labels) throws RemoteException;

	/** Ustawianie property dla Vertex'a. */
	public void setRemoteVertexProperty(Object id, String key, Object value, boolean master) throws RemoteException;

	/** Ustawianie property dla Edge'a. */
	public void setRemoteEdgeProperty(Object id, String key, Object value, boolean master) throws RemoteException;

	/** Usuwanie property dla Vertex'a. */
	public void removeRemoteVertexProperty(Object id, String key, boolean master) throws RemoteException;

	/** Usuwanie property dla Edge'a. */
	public void removeRemoteEdgeProperty(Object id, String key, boolean master) throws RemoteException;

	/** Dodawanie krawedzi wejsciowej do Vertex'a. */
	public void addRemoteToVertexInEdge(Object v_id, Object e_id, String label, boolean b) throws RemoteException;

	/** Dodawanie krawedzi wyjsciowej do Vertex'a. */
	public void addRemoteToVertexOutEdge(Object v_id, Object e_id, String label, boolean b) throws RemoteException;

	/** Usuwanie krawedzi wejsciowej z Vertex'a. */
	public void removeRemoteFromVertexInEdge(Object v_id, Object e_id, boolean b) throws RemoteException;

	/** Usuwanie krawedzi wyjsciowej z Vertex'a. */
	public void removeRemoteFromVertexOutEdge(Object v_id, Object e_id, boolean b) throws RemoteException;

	/** Dodawanie nowego backupu Vertex'a. */
	public void createNewVertexBackup(String id) throws RemoteException;

	/** Dodawanie nowego backupu Edge'a. */
	public void createNewEdgeBackup(String id) throws RemoteException;

	/** Uaktualnianie indeksow serwera o podanym ip. */
	public void updateThisServer(InetSocketAddress ip) throws RemoteException;
}
